#define _CRT_SECURE_NO_WARNINGS 1

#include <string.h>
#include <stdio.h>
#include <stdlib.h>



//const int xy[][2] = { 1, 0, 0, 1, 0, -1, -1, 0 };
//int chakevalid(int row, int col, int x, int y)
//{
//    if (x < 0 || x >= row || y < 0 || y >= col)
//    {
//        return 1;
//    }
//    return 0;
//}
//void dfs(char** board, int row, int col, int x, int y, char* word, int* index)
//{
//    if (chakevalid(row, col, x, y) || word[*index] == 0 || board[x][y] == ' ')
//    {
//        return;
//    }
//    if (board[x][y] == word[*index])
//    {
//        (*index)++;
//        board[x][y] = ' ';
//        for (int i = 0; i < 4; ++i)
//        {
//            dfs(board, row, col, x + xy[i][0], y + xy[i][1], word, index);
//        }
//        for (int i = 0; i < 4; ++i)
//        {
//            dfs(board, row, col, x + xy[i][0], y + xy[i][1], word, index);
//        }
//    }
//    else
//    {
//        return;
//    }
//}
//int test()
//{
//	char* board[] = { "CAA", "AAA", "BCD" };
//	char word[] = "AAB";
//	int row = 3;
//	int col = 3;
//    for (int i = 0; i < row; ++i)
//    {
//        for (int j = 0; j < col; ++j)
//        {
//            if (board[i][j] == word[0])
//            {
//                char** cpy = (char**)malloc(sizeof(char*) * row);
//                for (int x = 0; x < row; ++x)
//                {
//                    cpy[x] = (char*)calloc(col + 1, 1);
//                }
//                for (int x = 0; x < row; ++x)
//                {
//                    memcpy(cpy[x], board[x], col);
//                }
//                int index = 0;
//                dfs(cpy, row, col, i, j, word, &index);
//                for (int x = 0; x < row; ++x)
//                {
//                    free(cpy[x]);
//                }
//                free(cpy);
//                if (index >= strlen(word))
//                {
//                    return 1;
//                }
//            }
//        }
//    }
//    return 0;
//}

void test1()
{
	/*char* num1 = "99";

	char* num2 = "999";

    int len1 = strlen(num1);
    int len2 = strlen(num2);
    if (len1 < len2)
    {
        char* change = num1;
        num1 = num2;
        num2 = change;
    }
    int* tmp = (int*)calloc(len1 + len2, 4);
    int tmpindex = len1 + len2 - 1;
    for (int i = len2 - 1; i >= 0; --i)
    {
        for (int j = len1 - 1; j >= 0; --j)
        {
            int sum = (num2[i] - '0') * (num1[j] - '0');
            tmp[i + j + 1] += sum;
        }
    }
    for (int i = 0; i < len1 + len2; ++i)
    {
        printf("%d ", tmp[i]);
    }
    printf("\n");
    int len = tmpindex;
    while (tmpindex > 0)
    {
        tmp[tmpindex - 1] += tmp[tmpindex] / 10;
        tmp[tmpindex] %= 10;
        --tmpindex;
    }
    for (int i = 0; i < len1 + len2; ++i)
    {
        printf("%d ", tmp[i]);
    }
    char* ret = (char*)calloc(len1 + len2 + 1, 1);
    int i = tmp[0] ? 0 : 1;
    while (i <= len)
    {
        sprintf(ret, "%d", tmp[i]);
        ++i;
    }
    free(tmp);*/


    /*char s[] = "";
    scanf("%s", &s);
    for (int i = strlen(s) - 1; i >= 0; --i)
    {
        printf("%d ", s[i] - '0');
    }*/



}

//
//int cmp(int* e1, int* e2)
//{
//    return *e2 - *e1;
//}
//void test2()
//{
//    char tasks[] = "AAABBBCCCDDE";
//    int tasksSize = strlen(tasks);
//    int arr[26] = { 0 };
//    for (int i = 0; i < tasksSize; ++i)
//    {
//        ++arr[tasks[i] - 'A'];
//    }
//    int n = 2;
//    int ans = 0;
//    for (int i = 0; i < 26; ++i)
//    {
//        while (arr[i])
//        {
//            --arr[i];
//            ++ans;
//            int tmp = n;
//            for (int j = i + 1; j < 26 && tmp; ++j)
//            {
//                if (arr[j])
//                {
//                    ++ans;
//                    --tmp;
//                    --arr[j];
//                }
//            }
//            qsort(arr, 26, 4, cmp);
//            if(arr[i])
//                ans += tmp;
//        }
//    }
//
//}
//
//int m = 12;
//int fun(int a, int b)
//{
//    int m = 24;
//    return m;
//}
//void Swap(char* e1, char* e2)
//{
//    char tmp = *e1;
//    *e1 = *e2;
//    *e2 = tmp;
//}
//void test()
//{
//    char order[] = "cba";
//    char s[] = "abcd";
//    int shash[26] = { 0 };
//    for (int i = 0; s[i]; ++i)
//    {
//        ++shash[s[i] - 'a'];
//    }
//    char* ret = (char*)calloc(strlen(s) + 1, 1);
//    int index = 0;
//    for (int i = 0; order[i]; ++i)
//    {
//        while (shash[order[i] - 'a'])
//        {
//            ret[index++] = order[i] - 'a' + 'a';
//            --shash[order[i] - 'a'];
//        }
//    }
//    for (int i = 0; i < 26; ++i)
//    {
//        while (shash[i])
//        {
//            ret[index++] = i + 'a';
//            --shash[i];
//        }
//    }
//}
void swap(char* a, char* b) {
    char t = *a;
    *a = *b, * b = t;
}
void reverse(char* a, char* b) {
    while (a < b) {
        swap(a++, --b);
    }
}
void test(int b)
{
    char s[] = "abbbbbbbbbbbb";
    int charsSize = strlen(s);
    int cur = 0;
    int slow = 0;
    int fast = 0;
    int gap = 0;
    for (fast = 0; fast < charsSize; ++fast)
    {
        if (fast == charsSize - 1 || s[fast] != s[fast + 1])
        {
            s[cur++] = s[fast];
            gap = fast - slow + 1;
            if (gap > 1)
            {
                int anchor = cur;
                while (gap)
                {
                    s[cur++] = gap % 10 + '0';
                    gap /= 10;
                }
                reverse(&s[anchor], &s[cur]);
            }
            slow = fast + 1;
        }
    }
    slow = slow;
}
int main()
{
    int i = 0;
    test(i++);
	return 0;
}                                 